#include <iostream>

using namespace std;

//单例模式：通过一个类只能使用唯一的一个对象

//主席
class Chairman
{
    //3.将唯一的指针 私有化之后， 提供公共的接口，变为只读状态
public:
    static Chairman * getInstance()
    {
        return singleMan;
    }

    //1.将默认构造函数 私有化，就不能在外面随意创建对象
private:
    Chairman()
    {
        cout << "Chairman构造函数调用" << endl;
    };

    //4.拷贝构造函数 也私有化。不能出c3拷贝c1的情况
    Chairman(const Chairman&){};

public:
    //2.只要拿到一个对象的指针即可，这个指针可以指向唯一的对象
    //构造函数被私有化之后，要创建对象就必须能够访问到class的私有域，只有class的成员可以访问class的私有域。可以利用static公有成员，它独立于class对象而存在，它是公有的，我们可以访问得到。
    //在某个static函数中创建了该class的对象，并以引用或者指针的形式将其返回，就获得了这个对象的使用权。
    static Chairman * singleMan; //需要在类外声明初始化
};
    //怎么初始化？
    //将上面的static删掉，加上Chairman的作用域即可
    Chairman * Chairman::singleMan = new Chairman;

    //不用delete,因为不知道什么时候delete,由系统去回收

void test01()
{
    Chairman * c1 = Chairman::getInstance();
    Chairman * c2 = Chairman::getInstance();

    //Chairman * c3 = new Chairman(*c1); //拷贝构造函数
    if(c1 == c2)
    {
        cout << "c1 == c2" << endl;
    }
    else 
    {
        cout << "c1 != c2" << endl;
    }

}

int main()
{
    cout << "main函数调用" << endl;

    test01();

    return 0;
}
//先走Chairman的构造函数，再走main函数。
//静态的成员变量在编译阶段就已经分配内存了,去new出来一个Chairman对象，就已经构造函数了
